<?php declare(strict_types=1);


namespace App\Rpc\Validator;


use App\Lib\Error\ErrorConstant;
use App\Rpc\Model\Dao\TenantDao;
use Swoft\Bean\BeanFactory;
use Swoft\Validator\Annotation\Mapping\Validator;
use Swoft\Validator\Exception\ValidatorException;
use Swoft\Validator\Contract\ValidatorInterface;
use Swoft\Validator\Annotation\Mapping\IsString;
use Swoft\Validator\Annotation\Mapping\Length;
use Swoft\Validator\Annotation\Mapping\IsInt;
use Swoft\Db\DB;

/**
 * Class TenantValidator
 *
 * @Validator("TenantValidator")
 *
 * @package App\Rpc\Validator
 */
class TenantValidator implements ValidatorInterface
{
    /**
     * @IsString(message="item_id类型不正确")
     * @var string
     */
    protected $item_id;

    /**
     * @IsString(message="公司名称类型不正确")
     *
     * @var string
     */
    protected $name;

    /**
     * @IsString(message="前缀格式不正确")
     * @Length(min=3, max=32, message="前缀格式格式不正确")
     * @var string
     */
    protected $prefix;

    /**
     * @IsString(message="平台名称格式不正确")
     * @Length(min=3, max=32, message="平台名称为3-32位字符")
     * @var string
     */
    protected $platform_name;

    /**
     * @IsString(message="公司logo类型不正确")
     * @Length(min=3, max=32, message="公司logo信息不正确")
     * @var string
     */
    protected $logo;

    /**
     * @IsString(message="账号格式不正确")
     * @Length(min=11, max=32, message="账号信息不正确")
     * @var string
     */
    protected $account;

    /**
     * @IsString(message="统一信用代码格式不正确")
     * @Length(min=7, max=32, message="统一信用代码信息不正确")
     * @var string
     */
    protected $credit_code;

    /**
     * @IsString(message="营业执照格式不正确")
     * @Length(min=3, max=32, message="营业执照信息不正确")
     * @var string
     */
    protected $credit;

    /**
     * @IsString(message="登记机关格式不正确")
     * @Length(min=3, max=32, message="登记机关信息不正确")
     * @var string
     */
    protected $tax_authority;

    /**
     * @IsString(message="法人姓名格式不正确")
     * @Length(min=1, max=32, message="法人姓名信息不正确")
     * @var string
     */
    protected $legal_name;

    /**
     * @IsString(message="法人身份证号格式不正确")
     * @Length(min=15, max=32, message="法人身份证号信息不正确")
     * @var string
     */
    protected $legal_code;

    /**
     * @IsString(message="通信地址格式不正确")
     * @Length(min=3, max=64, message="通信地址信息不正确")
     * @var string
     */
    protected $address;

    /**
     * @IsString(message="联系人姓名格式不正确")
     * @Length(min=1, max=32, message="联系人姓名信息不正确")
     * @var string
     */
    protected $contact_name;

    /**
     * @IsString(message="联系人电话格式不正确")
     * @Length(min=3, max=32, message="联系人电话信息不正确")
     * @var string
     */
    protected $contact_phone;

    /**
     * @IsString(message="身份证正面格式不正确")
     * @Length(min=3, max=32, message="身份证正面信息不正确")
     * @var string
     */
    protected $id_card_face;

    /**
     * @IsString(message="身份证反面格式不正确")
     * @Length(min=3, max=32, message="身份证反面信息不正确")
     * @var string
     */
    protected $id_card_back;

    /**
     * @IsString(message="app_id格式不正确")
     * @Length(min=3, max=32, message="app_id信息不正确")
     * @var string
     */
    protected $app_id;

    /**
     * @IsString(message="app_secret格式不正确")
     * @Length(min=3, max=32, message="app_secret信息不正确")
     * @var string
     */
    protected $app_secret;

    /**
     * @IsString(message="app_check格式不正确")
     * @Length(min=3, max=32, message="app_check信息不正确")
     * @var string
     */
    protected $app_check;

    /**
     * @IsInt(message="冻结状态类型不正确")
     *
     * @var int
     */
    protected $frozen_state;

    /**
     * @IsInt(message="创建时间不合法")
     *
     * @var int
     */
    protected $created_at;

    /**
     * @IsInt(message="更新时间不合法")
     *
     * @var int
     */
    protected $updated_at;

    /**
     * @param array $data
     * @param array $params
     * @return array
     * @throws ValidatorException
     */
    public function validate(array $data, array $params): array
    {
        $op = $params['op'] ?? null;
        $valid_item_id = $data['item_id'] ?? null;
        $name = $data['name'] ?? null;
        $prefix = $data['prefix']??null;

        if (empty($valid_item_id) && $op == 'add') {
            throw new ValidatorException("唯一item_id必须填写", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        if ($op == 'add' && strlen($valid_item_id) != 32) {
            throw new ValidatorException("唯一item_id格式不正确", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !$name) {
            throw new ValidatorException("请输入租户名称", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !$prefix) {
            throw new ValidatorException("请输入租户唯一标识", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        if ($prefix) {
            //验证账号是否唯一
            $first = DB::table('tenant')->db($data['dbName'])->where(['prefix' => $prefix])->first();
            if ($first) {
                throw new ValidatorException("租户已经添加", ErrorConstant::VALIDATE_ERROR_CODE);
            }
        }

        /** 开始验证所有的字段 */
        //验证是否存在
        if ($op == 'add' && !($data['account']??null)) {
            throw new ValidatorException("请输入平台名称", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['credit_code']??null)) {
            throw new ValidatorException("请输入统一信用代码", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['credit']??null)) {
            throw new ValidatorException("请输入营业执照", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['tax_authority']??null)) {
            throw new ValidatorException("请输入登记机关", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['legal_name']??null)) {
            throw new ValidatorException("请输入法人姓名", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['legal_code']??null)) {
            throw new ValidatorException("请输入法人身份证号", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['address']??null)) {
            throw new ValidatorException("请输入通信地址", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['contact_name']??null)) {
            throw new ValidatorException("请输入联系人姓名", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['contact_phone']??null)) {
            throw new ValidatorException("请输入联系人电话", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['id_card_face']??null)) {
            throw new ValidatorException("请输入身份证正面照", ErrorConstant::VALIDATE_ERROR_CODE);
        }

        //验证是否存在
        if ($op == 'add' && !($data['id_card_back']??null)) {
            throw new ValidatorException("请输入身份证反面照", ErrorConstant::VALIDATE_ERROR_CODE);
        }
        return $data;
    }
}
